package com.xinqi.modules.discuss.notice.service;

import com.xinqi.common.base.response.PageInfo;
import com.xinqi.common.base.response.Param;
import com.xinqi.common.mybatis.data.service.BaseService;
import com.xinqi.modules.discuss.notice.domain.CourseNoticeEntity;
import com.xinqi.modules.discuss.notice.dto.req.*;
import com.xinqi.modules.discuss.notice.dto.rsp.CourseNoticeResultDTO;
import com.xinqi.modules.discuss.notice.dto.rsp.CourseNoticeStudentLogResultDTO;
import com.xinqi.modules.stats.assistant.dto.rsp.AssistantTotalResultDTO;
import com.xinqi.modules.stats.assistant.dto.rsp.StudentInfoResultDTO;

import java.util.List;

/**
 * 课程公告主表服务层
 *
 * @author: yyzhen
 * @date: 2023/03/21
 */
public interface CourseNoticeService extends BaseService<CourseNoticeEntity> {

    /**
     * 分页列表
     *
     * @param pageable
     * @param query
     * @return
     */
    PageInfo<CourseNoticeResultDTO> selectPage(Param pageable, CourseNoticeQueryDTO query);

    /**
     * 获取个人与公告的详情
     *
     * @param id
     * @param userId
     * @return
     */
    CourseNoticeResultDTO findByIdAndUserId(Long id, Long userId);

    /**
     * 创建公告
     *
     * @param dto
     * @return
     */
    Boolean insert(CourseNoticeCreateDTO dto);

    /**
     * 修改公告
     *
     * @param dto
     * @return
     */
    String updateById(CourseNoticeUpdateDTO dto);

    /**
     * 根据ID删除
     *
     * @param dto
     * @return
     */
    Boolean remove(CourseNoticeDeleteDTO dto);

    /**
     * 根据ID批量删除
     *
     * @param dto
     * @return
     */
    Boolean batchRemove(CourseNoticeDeleteDTO dto);

    /**
     * 设为置顶
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean isTop(Long id, Long userId);

    /**
     * 取消置顶
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean cancelTop(Long id, Long userId);

    /**
     * 发布
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean isRelease(Long id, Long userId);

    /**
     * 发布V2版本
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean isReleaseV2(Long id, Long userId);

    /**
     * 确认
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean confirm(Long id, Long userId);

    /**
     * 公告下载
     *
     * @param dto
     * @return
     */
    List<String> download(CourseNoticeDownloadDTO dto);

    /**
     * 查看学生已读确认列表
     *
     * @param pageable
     * @param query
     * @return
     */
    PageInfo<CourseNoticeStudentLogResultDTO> selectStudentLogPage(Param pageable, CourseNoticeStudentLogQueryDTO query);

    /**
     * 一键提醒
     *
     * @param id
     * @param userId
     * @return
     */
    Boolean reminderStudent(Long id, Long userId);

    /**
     * 公告 -- 定时发布
     *
     * @return
     */
    boolean releaseNotice();

    /**
     * 班级添加成员 -- 公告同步
     *
     * @param classId
     * @param userId
     * @return
     */
    Boolean classAddMembers(Long classId, Long userId);

    /**
     * 班级退出成员 -- 公告同步
     *
     * @param classId
     * @param userId
     * @return
     */
    Boolean classRemoveMembers(Long classId, Long userId);

    /**
     * 班级成员身份变更 -- 公告同步
     * <p>
     * 本质上：
     * 学生课代表身份互换无需操作
     * 老师助教身份互换无需操作
     * 学生课代表调整为老师助教是需要改变
     * 老师助教调整为学生课代表时需要改变
     * <p>
     * 公告的已读与确认是针对于学生而已，不计算老师
     * <p>
     *
     * @param classId
     * @param userId
     * @return
     */
    Boolean classChangeIdentity(Long classId, Long userId);

    /**
     * 公共参与未参与统计
     */
    AssistantTotalResultDTO selectNoticeTakeTotal(Long contentId);

    /**
     * 公告已读未读统计
     */
    List<StudentInfoResultDTO> selectNoticeReadTakeStudent(Long contentId, Integer isRead);

    /**
     * 公告已确认未确认统计
     */
    List<StudentInfoResultDTO> selectNoticeConfirmTakeStudent(Long contentId, Integer isConfirm);

    /**
     * 进行中公告查询列表
     */
    List<CourseNoticeEntity> selectNoticeRunningList(Long classId);

    /**
     * 同步主表 -- 公告
     *
     * @param notice
     */
    void synchroContentNotice(CourseNoticeResultDTO notice);

    /**
     * 同步主表 -- 公告
     *
     * @param noticeList
     */
    void synchroContentNotice(List<CourseNoticeResultDTO> noticeList);

}
